"""
爬虫基本思路：
（一）数据来源分析
    1、爬什么   小说，静态（文档标签中可以看到） ==> div>p
    2、在哪儿爬 URL

（二）爬虫代码实现
    1、发送请求
    2、数据获取
    3、数据解析
    4、数据保存
        txt文本存储方式：
            open()函数
            功能：打开一个文件
            参数：
                1、路径
                2、方式
                    w 写
                    r 读
                    a 追加写
                    + 读写
                    b 二进制
                3、编码
                4、newline="\n"
            返回值：一个文件句柄（对象）

        上下文管理器 with

"""
import os

# 请求库
import requests
# 解析库
from lxml import etree


# 获取数据
def get_html(url, headers):
    try:

        resp = requests.get(url=url, headers=headers)
        resp.encoding = 'utf-8'
        return resp.text  # 获取文本   resp.json()  # 获取Json格式
    except:
        return ''


# 解析数据
def parse_html(html):
    """
    etree()函数
    功能：将string解析成文档标签树对象
    参数：
        1、你要解析的string，
        2、解析器，
    返回值：标签树对象
    """
    try:
        tree = etree.HTML(html)  # 实例化一个标签树
        result = tree.xpath('//div[contains(@class,"read-content")]/p/text()')  # 用xpath语法找到p标签中的文本
        return result
    except:
        return []


# 保存数据
def save_result(result, chapter):
    if not os.path.exists('./小说'):
        os.mkdir('小说')

    with open(f"./小说/{chapter['name']}.txt", 'a+', encoding='utf-8') as f:
        for string in result:
            # string 数据类型的方法，去除两边的空格符
            txt = string.strip() + '\n'
            f.write(txt)

    print(chapter['name'], '保存成功！')


# 主程序
def main(chapter):
    url = chapter['url']
    headers = {
        'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.48',
    }

    html = get_html(url, headers)
    if html:
        print('获取成功！')
        result = parse_html(html)
        if result:
            print('解析成功！')
            save_result(result, chapter)
    else:
        print('获取失败！')


if __name__ == '__main__':
    chapter = {
        'name': '第一章《抡语》',
        'url': 'https://read.qidian.com/chapter/4wFx7El64YkTFqQ-idajwA2/KBZsjKHPpgD6ItTi_ILQ7A2/'
    }
    main(chapter)
